package 设计模式.结构型.代理模式.静态代理.extends实现3;

import org.omg.PortableInterceptor.RequestInfo;
import 设计模式.结构型.代理模式.静态代理.最初的需求1.MetricsCollector;
import 设计模式.结构型.代理模式.静态代理.最初的需求1.UserVo;

/**
 * 当原始的类是第三方的类的时候，就需要通过这种方法来实现
 *
 * 静态代理普遍存在一个问题是：
 *  一方面，我们需要在代理类中，将原始类中的所有的方法，都重新实现一遍，并且为每个方法都附加相似的代码逻辑。
 *  另一方面，如果要添加的附加功能的类有不止一个，我们需要针对每个类都创建一个代理类。
 *  如果有 50 个要添加附加功能的原始类，那我们就要创建 50 个对应的代理类。这会导致项目中类的个数成倍增加，增加了代码维护成本。
 *
 * 需要把所有的情况都预先想好，然后通过硬编码的方式来实现。这样的话，是不能作为框架来使用的，由此就出现了动态代理
 * 不事先为每个原始类编写代理类，而是在运行的时候，动态地创建原始类对应的代理类，然后在系统中用代理类替换掉原始类。
 *
 * 动态代理底层依赖的就是 Java 的反射语法
 *
 */
public class UserControllerProxy extends UserController {

    private MetricsCollector metricsCollector;

    public UserControllerProxy() {
        this.metricsCollector = new MetricsCollector();
    }

    @Override
    public UserVo login(String telephone, String password) {
        long startTimestamp = System.currentTimeMillis();

        UserVo userVo = super.login(telephone, password);

        long endTimeStamp = System.currentTimeMillis();
        long responseTime = endTimeStamp - startTimestamp;
        RequestInfo requestInfo = null;
//                new RequestInfo("login", responseTime, startTimestamp);
        metricsCollector.recordRequest(requestInfo);

        return userVo;
    }

    @Override
    public UserVo register(String telephone, String password) {
        long startTimestamp = System.currentTimeMillis();

        UserVo userVo = super.register(telephone, password);

        long endTimeStamp = System.currentTimeMillis();
        long responseTime = endTimeStamp - startTimestamp;
        RequestInfo requestInfo = null;
//                new RequestInfo("register", responseTime, startTimestamp);
        metricsCollector.recordRequest(requestInfo);

        return userVo;
    }
}
